using System;
using System.Text;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using ClickSocial.Framework;
using ClickSocial.Data;
using ClickSocial.Entities;
using System.Web;
using System.Web.Security;
using System.Web.Profile;
using System.Data;
using System.Configuration;

namespace ClickSocial.Components
{
    public class Evento
    {
        static EventoDal _instance;

        #region Singleton
        public Evento()
        {

        }

        public static EventoDal Instance()
        {
            if (_instance == null)
            {
                if (HttpContext.Current == null)
                    _instance = new EventoDal();
                else
                {
                    EventoDal inst = HttpContext.Current.Items["EventoDalSingleton"] as EventoDal;
                    if (inst == null)
                    {
                        inst = new EventoDal();
                        HttpContext.Current.Items.Add("EventoDalSingleton", inst);
                    }
                    return inst;
                }
            }
            return _instance;
        } 
        #endregion

        static public EventoInfo GetOne(long id)
        {
            return CBO.FillObject<EventoInfo>(Instance().GetOne(id));
        }

        static public List<EventoInfo> GetAll()
        {
            return CBO.FillCollection<EventoInfo>(Instance().GetAll());
        }

        static public List<EventoInfo> GetAllOnlyPublics()
        {
            return CBO.FillCollection<EventoInfo>(Instance().GetAll((int)TipoVisibilidad.Publico));
        }

        static public List<EventoInfo> GetAllByFotografo(string userId)
        {
            return CBO.FillCollection<EventoInfo>(Instance().GetAllByFotografo(userId));
        }

        static public List<EventoInfo> GetAllByFotografoConPerm(string userId, int permiso)
        {
            return CBO.FillCollection<EventoInfo>(Instance().GetAllByUserFotografoPerm(userId, permiso));
        }

        static public List<EventoInfo> GetAllByUserEvent(string userId)
        {
            return CBO.FillCollection<EventoInfo>(Instance().GetAllByUserEvent(userId));
        }

        static public void Insert(EventoInfo e)
        {
            long EventoID = Instance().Insert(e.Nombre, e.Descripcion, e.Visibilidad, e.Precio, e.Fecha, e.Fotografo, e.Clave);
            e = GetOne(EventoID);
        }

        static public void Insert(string nombre, string descripcion, int visibilidad, double precio, DateTime fecha, string fotografo, out long eventoId, string clave)
        {
            eventoId = Instance().Insert(nombre, descripcion, visibilidad, precio, fecha, fotografo, clave);
        }

        static public EventoInfo Insert(string nombre, string descripcion, int visibilidad, double precio, DateTime fecha, string fotografo, string clave)
        {
            long eventoId = Instance().Insert(nombre, descripcion, visibilidad, precio, fecha, fotografo,clave);
            return GetOne(eventoId);
        }

        public EventoInfo Update(long eventoId, string nombre, string descripcion, int visibilidad, double precio, DateTime fecha, string fotografo, string tapa, string clave)
        {
            Instance().Update(eventoId, nombre, descripcion, visibilidad, precio, fecha, fotografo, tapa, clave);
            return GetOne(eventoId);
        }

        static public void Update(EventoInfo e)
        {
            Instance().Update(e.EventoID, e.Nombre, e.Descripcion, e.Visibilidad, e.Precio, e.Fecha, e.Fotografo, e.Tapa, e.Clave);
        }

        static public void Delete(long eventId)
        {
            Instance().Delete(eventId);
        }

        static public void AddUserEvent(long eventoId, string userName)
        {
            Instance().AddUserEvent(eventoId, userName);
        }

        static public void DelUserEvent(long eventoId, string userName)
        {
            Instance().DelUserEvent(eventoId, userName);
        }

        static public string[] GetUsersInEvent(long eventoId)
        {
            List<string> users = new List<string>();

            using(IDataReader dr = Instance().UsersInEvent(eventoId))
            {
                while (dr.Read())
                {
                    users.Add(dr.GetString(0));
                }
            }

            return users.ToArray();
        }

        #region Metodos de busqueda

        static public List<EventoInfo> BusquedaPorFechaEvento(DateTime desde, DateTime hasta)
        {
            return CBO.FillCollection<EventoInfo>(Instance().GetAllByFechaPerm(desde, hasta, (int)TipoVisibilidad.Publico_ConAcceso));
        }
        static public List<EventoInfo> BusquedaPorNombreEvento(string nombre)
        {
            return CBO.FillCollection<EventoInfo>(Instance().GetAllByNombrePerm(nombre,(int)TipoVisibilidad.Publico_ConAcceso));
        }
        static public List<EventoInfo> BusquedaPorCiudad(string nombre)
        {
            string user_fotografo = string.Empty;
            List<EventoInfo> listEvento = new List<EventoInfo>();

            foreach (string user in Roles.GetUsersInRole("Fotografo"))
            {
                PerfilComun p = ProfileBase.Create(user) as PerfilComun;

                if (p.Ciudad.ToLower().IndexOf(nombre) != -1)
                {
                    user_fotografo = p.UserName;

                    if (listEvento.Count == 0)
                    {
                        listEvento = GetAllByFotografoConPerm(user_fotografo, (int)TipoVisibilidad.Publico_ConAcceso);
                    }
                    else
                    {
                        listEvento.AddRange(GetAllByFotografoConPerm(user_fotografo, (int)TipoVisibilidad.Publico_ConAcceso));
                    }

                }
            }

            return listEvento; 

        }
        static public List<EventoInfo> BusquedaPorFotografo(string nombre)
        {

            string user_fotografo = string.Empty;
            List<EventoInfo> listEvento = new List<EventoInfo>();

            foreach (string user in Roles.GetUsersInRole("Fotografo"))
            {
                PerfilComun p = ProfileBase.Create(user) as PerfilComun;

                if(UsuarioEncontrado(nombre, p))
                //if (p.Nombre.ToLower().IndexOf(nombre) != -1 || p.Apellido.ToLower().IndexOf(nombre) != -1 || user.ToLower().IndexOf(nombre) != -1)
                {
                    user_fotografo = p.UserName;

                    if (listEvento.Count == 0)
                    {
                        listEvento = GetAllByFotografoConPerm(user_fotografo,(int)TipoVisibilidad.Publico_ConAcceso);
                    }
                    else
                    {
                        listEvento.AddRange(GetAllByFotografoConPerm(user_fotografo, (int)TipoVisibilidad.Publico_ConAcceso));
                    }
                    
                }
            }

            return listEvento; 
                
        }
        static public bool UsuarioEncontrado(string nombres, PerfilComun perfil)
        {
            
            string[] arrNombres = nombres.Split(' ');
            bool busquedaOK = false;
            bool buscar_varios = (arrNombres.Length > 0);

            if (buscar_varios)
            {
                foreach (string nombre in arrNombres)
                {
                    if (perfil.Nombre.ToLower().IndexOf(nombre) != -1 || perfil.Apellido.ToLower().IndexOf(nombre) != -1 || perfil.UserName.ToLower().IndexOf(nombre) != -1)
                    {
                        busquedaOK = true;
                        break;
                    }
                }
            }
            else
            {
                if (perfil.Nombre.ToLower().IndexOf(nombres) != -1 || perfil.Apellido.ToLower().IndexOf(nombres) != -1 || perfil.UserName.ToLower().IndexOf(nombres) != -1)
                {
                    busquedaOK = true;                    
                }
            }

            return busquedaOK;
        }
        #endregion


        static public void DeleteByUserEvent(string userEvent)
        {
            Instance().DeleteByUserEvent(userEvent);
        }

        static public void DeleteByUserFotografo(string userFotografo)
        {
            Instance().DeleteByUserFotografo(userFotografo);
        }
    }
}
